type checking in compiler design